/**
 * @file key.c
 * @author your name (you@domain.com)
 * @brief
 * @version 0.1
 * @date 2024-06-08
 *
 * @copyright Copyright (c) 2024
 *
 */

#include "key.h"

void key_init(void)
{
	gpio_config_t gpio_init_struct;
	gpio_init_struct.intr_type = GPIO_INTR_DISABLE;		   /* 失能引脚中断 */
	gpio_init_struct.mode = GPIO_MODE_INPUT;			   /* 输入模式 */
	gpio_init_struct.pull_up_en = GPIO_PULLUP_ENABLE;	   /* 使能上拉 */
	gpio_init_struct.pull_down_en = GPIO_PULLDOWN_DISABLE; /* 失能下拉 */
	gpio_init_struct.pin_bit_mask = 1ull << BOOT_GPIO_PIN; /* BOOT 按键引脚 */
	gpio_config(&gpio_init_struct);						   /* 配置使能 */
}

/**
 * @brief 按键扫描函数
 * @param mode:0 / 1, 具体含义如下:
 * 0, 不支持连续按(当按键按下不放时, 只有第一次调用会返回键值,
 * 必须松开以后, 再次按下才会返回其他键值)
 * 1, 支持连续按(当按键按下不放时, 每次调用该函数都会返回键值)
 * @retval 键值, 定义如下:
 * BOOT_PRES, 1, BOOT 按下
 */
uint8_t key_scan(uint8_t mode)
{
	uint8_t keyval = 0;
	static uint8_t key_boot = 1; /* 按键松开标志 */
	if (mode)
	{
		key_boot = 1;
	}
	if (key_boot && (BOOT == 0)) /* 按键松开标志为 1，且有任意一个按键按下了 */
	{
		vTaskDelay(10); /* 去抖动 */
		key_boot = 0;
		if (BOOT == 0)
		{
			keyval = BOOT_PRES;
		}
	}
	else if (BOOT == 1)
	{
		key_boot = 1;
	}
	return keyval; /* 返回键值 */
}